package com.niit.mall.cart.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.niit.mall.api.client.ProductClient;
import com.niit.mall.cart.domain.dto.CartFormDTO;
import com.niit.mall.cart.domain.po.Cart;
import com.niit.mall.cart.domain.vo.CartVO;
import com.niit.mall.cart.mapper.CartMapper;
import com.niit.mall.cart.service.ICartService;
import com.niit.mall.common.utils.BeanUtils;
import com.niit.mall.common.utils.CollUtils;
import com.niit.mall.common.utils.UserContext;
import com.niit.mall.common.api.ResultCode;
import com.niit.mall.common.exception.Asserts;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;


import java.time.LocalDateTime;
import java.util.Collection;
import java.util.List;


/**
 * <p>
 * 购物车 服务实现类
 * </p>
 *
 * @author ChuXuan
 * @since 2025-05-26
 */
@Service
@RequiredArgsConstructor
@Slf4j
public class CartServiceImpl extends ServiceImpl<CartMapper, Cart> implements ICartService {
	

	private final ProductClient productClient;
	
	/**
	 * 查询当前用户的购物车列表
	 *
	 * @return 当前用户购物车列表的视图对象集合
	 */
	@Override
	public List<CartVO> queryMyCarts() {
		Long userId = UserContext.getUser();
		// 1.查询我的购物车列表
		List<Cart> carts = lambdaQuery().eq(Cart::getUserId,userId ).list();
		if (CollUtils.isEmpty(carts)) {
			return CollUtils.emptyList();
		}
		
		// 2.转换VO
		List<CartVO> vos = BeanUtils.copyList(carts, CartVO.class);
		
		// 3.处理VO中的商品信息
//		handleCartItems(vos);
		// 4.返回
		return vos;
	}
	private void handleCartItems(List<CartVO> vos) {
//		// 1.获取商品id
//		Set<Long> itemIds = vos.stream().map(CartVO::getItemId).collect(Collectors.toSet());
//		// 2.查询商品
//		List<ProductDTO> items = productClient.queryItemByIds(itemIds);
//		if (CollUtils.isEmpty(items)) {
//			return;
//		}
//		// 3.转为 id 到 item的map
//		Map<Long, ItemDTO> itemMap = items.stream().collect(Collectors.toMap(ItemDTO::getId, Function.identity()));
//		// 4.写入vo
//		for (CartVO v : vos) {
//			ItemDTO item = itemMap.get(v.getItemId());
//			if (item == null) {
//				continue;
//			}
//			v.setNewPrice(item.getPrice());
//			v.setStatus(item.getStatus());
//			v.setStock(item.getStock());
//		}
	}
	
	/**
	 * 添加购物车项。
	 *
	 * @param cartFormDTO 购物车表单数据传输对象
	 * @return
	 * @throws RuntimeException 如果检测到购物车已满或发生其他非法状态
	 */
	@Override
	public Cart addCartItem(CartFormDTO cartFormDTO) {
		Long userId = UserContext.getUser();
		LocalDateTime now = LocalDateTime.now();
		// 已存在更新数目
		if(checkItemExists(cartFormDTO.getProductId(), userId)){
			cartFormDTO.setUpdateDateTime(now);
			baseMapper.updateNum(cartFormDTO.getProductId(),userId);

			return baseMapper.selectOne(
					new QueryWrapper<Cart>().lambda()
							.eq(Cart::getUserId, userId)
							.eq(Cart::getProductId, cartFormDTO.getProductId()));
		}
		// 购物车已满
		checkCartsFull(userId);
		// 增加购物车
		Cart cart = BeanUtils.copyBean(cartFormDTO, Cart.class);
		cart.setCreateDateTime(now);
		cart.setUpdateDateTime( now);
		cart.setUserId(userId);
		save(cart);
		return cart;
	}

	/**
	 * 根据商品ID集合删除购物车中的条目
	 *
	 * @param itemIds 商品ID的集合
	 */
	@Override
	public void removeByItemIds(Collection<Long> itemIds) {
		// 1.构建删除条件，userId和itemId
		QueryWrapper<Cart> queryWrapper = new QueryWrapper<Cart>();
		queryWrapper.lambda()
				.eq(Cart::getUserId, UserContext.getUser())
				.in(Cart::getId, itemIds);
		// 2.删除
		remove(queryWrapper);
	}

	/**
	 * 检查购物车中是否存在指定用户和商品项
	 *
	 * @param itemId 商品ID
	 * @param userId 用户ID
	 * @return 如果购物车中存在指定用户和商品项返回true，否则返回false
	 */
	private boolean checkItemExists(Long itemId, Long userId) {
		Long count = lambdaQuery()
				            .eq(Cart::getUserId, userId)
				            .eq(Cart::getProductId, itemId)
				            .count();
		return count > 0;
	}


	/**
	 * 检查指定用户购物车是否已满
	 *
	 * @param userId 用户ID
	 * @throws IllegalArgumentException 购物车数量达到上限时抛出异常
	 */
	private void checkCartsFull(Long userId) {
		Long count = lambdaQuery().eq(Cart::getUserId, userId).count();
		if (count >= 10) {
			Asserts.fail(ResultCode.FAILED);
		}
	}

	@Override
	public void reduceStock( Long productId, Integer quantity) {
		Long userId = UserContext.getUser();
		log.info("reduceStock userId:{}, productId:{}, quantity:{}", userId, productId, quantity);
		// 根据id 查询购物车项
		Cart cart = baseMapper.selectOne(new QueryWrapper<Cart>()
				.lambda()
				.eq(Cart::getUserId, userId)
				.eq(Cart::getProductId, productId));
		// 判断数量减少后是否小于0 如果小于0 则删除该购物车项
		if (cart.getQuantity() - quantity < 0) {
			remove(new QueryWrapper<Cart>()
					.lambda()
					.eq(Cart::getUserId, userId)
					.eq(Cart::getProductId, productId));
			return;
		}
		// 更新购物车项的数量
		cart.setQuantity(cart.getQuantity() - quantity);
		cart.setUpdateDateTime(LocalDateTime.now());
		log.info("reduceStock cart:{}", cart);
		baseMapper.updateById(cart);
	}
}
